#include <search.h> требуется только для объявления функции char *lsearch(key,base,num,width,compare); char *lfind(key,base,num,width,compare); char *key; ключ поиска char *base; указатель на поисковую базу данных unsigned *num,width; число и размер элементов int (*compare)(); указатель на функцию сравнения
Описание.
Функции lsearch и lfind производят строковый поиск для значения key в массиве из num элементов, каждый размером width байт. (В отличии от bsearch, lsearch и lfind не требуют отсортированного массива). Аргумент base является указателем на базу массива, который нужно найти.
Если key не найден, lsearch присоединяет его в конец. Функция lfind этого не делает.
Аргумент compare является указателем на процедуру, поставляемую пользователем, которая сравнивает два элемента массива и возвращает значение, определяющее их отношение. Обе функции вызывают процедуру compare в течении поиска один или несколько раз, пересылая в каждом вызове указатели на два элемента массива. Эта процедура должна сравнивать элементы, а затем возвращать одно из следующих значений:
Значение Его смысл
не равно 0 element 1 и element 2 различны
0 element 1 равен element 2
Возвращаемое значение.
Обе функции lsearch и lfind возвращают указатель на первое возникновение key в массиве, на который указывает base.
Если key не найден, эти функции возвращают NULL.
Пример:
/* функция lsearch производит строковый поиск в массиве для
элемента "key"; lsearch возвращает указатель на структуру, если в
ней содержится key, и NULL - если его нет. */
#include <search.h>
#include <string.h>
#include <stdio.h>
int compare();
/* должна быть объявлена как функция */
main (argc, argv)
int argc;
char **argv;
{
char **result;
char *key = "PATH";
/* следующий оператор находит аргумент, начинающийся с
"PATH", в предположении, что аргументы лексикографически отсорти-
рованы */
result = (char **)bsearch((char *)&key,
(char *)argv, argc, sizeof(char *),
compare);
if (result)
printf ("%s found\n", *result);
else
printf("PATH not found!\n");
}
int compare (arg1, arg2)
char **arg1, **arg2;
{
return(strncmp(*arg1, *arg2, strlen(*arg1)));
}